import 'dart:typed_data';

import '../../../base/realtime/realtime_battery_base.dart';
import '../../../tools/bit_utils.dart';

/*
    uint16_t voltage;               //电压         单位 0.01V（来自驱动板）
    int16_t charge_current;         //充电电流         单位 0.01A（来自驱动板）
    int16_t discharge_current;      //放电电流         单位 0.01A（来自驱动板）

    //6个状态位
    uint16_t state_detected       : 1; //0 电池信号无效   1 电池信号有效  （来自驱动板，对于有通讯的电池即为电池通讯状态）
    uint16_t state_enable         : 1; //0 电池未开启     1 电池开启      （来自驱动板）
    uint16_t state_charge         : 1; //0 未充电状态     1 充电状态      （来自驱动板）
    uint16_t state_reserve        : 3; //保留

    //10个故障或警告位
    uint16_t error_logic             : 1; //0 信号逻辑正常   1 信号逻辑错误（电池信号存在，但电压低于一定值 或者 电池信号不存在，但电压高于一定值）
    uint16_t error_signal            : 1; //0 电池未报错     1 电池报错（只有不含通讯的电池有此故障）
    uint16_t error_voltage_sensor    : 1; //0 电压传感器正常 1 电压传感器故障（来自驱动板）
    uint16_t error_current_sensor    : 1; //0 电流传感器正常 1 电流传感器故障（来自驱动板）
    uint16_t error_cannot_charge     : 1; //0 未发现无法充电 1 电池无法充电故障（来自驱动板）
    uint16_t battery_warning         : 1; //BMS 有报警信息（来自BMS）
    uint16_t battery_protect         : 1; //BMS 触发保护（来自BMS）
    uint16_t battery_error           : 1; //BMS 有故障信息（来自BMS）
*/

// Lorin 实时电池信息
abstract class LorinRealtimeBatteryInfo<T extends LorinBatteryPackInfoBase>
    extends RealtimeBatteryInfoBase<T> {
  LorinRealtimeBatteryInfo.fromBytes(super.batteryPacks) : super.fromBytes();

  @override
  int get batteryPacksCount => 2;

  @override
  int get minLength => 16;
}

// Lorin 电池包信息
abstract class LorinBatteryPackInfoBase extends BatteryPackInfoBase {
  // 电压
  int voltage = 0; // 电压 单位 0.01V
  int chargeCurrent = 0; // 充电电流 单位 0.01A
  int dischargeCurrent = 0; // 放电电流 单位 0.01A

  // 状态位
  bool stateDetected = false; // 0 电池信号无效   1 电池信号有效
  bool stateEnable = false; // 0 电池未开启     1 电池开启
  bool stateCharge = false; // 0 未充电状态     1 充电状态

  // 故障或警告位 0 信号逻辑正常   1 信号逻辑错误（电池信号存在，但电压低于56V（高于62V恢复） 或者  电池信号不存在，但电压高于12V（低于6V恢复））
  bool errorLogic = false;
  bool errorSignal = false;
  bool errorVoltageSensor = false; // 0 电压传感器正常 1 电压传感器故障
  bool errorCurrentSensor = false; // 0 电流传感器正常 1 电流传感器故障
  bool errorCannotCharge = false; // 0 未发现无法充电 1 电池无法充电故障
  bool batteryWarning = false; // BMS 有报警信息
  bool batteryProtect = false; // BMS 触发保护
  bool batteryError = false; // BMS 有故障信息

  LorinBatteryPackInfoBase.fromBytes(Uint8List bytes) : super.fromBytes(bytes) {
    if (bytes.length < bytesLength) {
      throw ArgumentError(
          '字节数组长度不足，无法解析 $runtimeType，期望长度至少为 $bytesLength，实际长度为 ${bytes.length}');
    }
    var byteData = ByteData.sublistView(bytes);
    // 解析电压
    voltage = byteData.getInt16(0, Endian.little); // 单位转换为0.01V
    // 解析充电电流（如果需要，可以添加）
    chargeCurrent = byteData.getInt16(2, Endian.little);
    // 解析放电电流（如果需要，可以添加）
    dischargeCurrent = byteData.getInt16(4, Endian.little);

    // 解析状态位
    int stateBits = byteData.getUint8(6);
    stateDetected = BitUtils.isBitOne(stateBits, 0);
    stateEnable = BitUtils.isBitOne(stateBits, 1);
    stateCharge = BitUtils.isBitOne(stateBits, 2);
    // 保留位（如果需要，可以添加处理逻辑）

    // 解析故障或警告位
    int errorBits = byteData.getUint8(7);
    errorLogic = BitUtils.isBitOne(errorBits, 0);
    errorSignal = BitUtils.isBitOne(errorBits, 1);
    errorVoltageSensor = BitUtils.isBitOne(errorBits, 2);
    errorCurrentSensor = BitUtils.isBitOne(errorBits, 3);
    errorCannotCharge = BitUtils.isBitOne(errorBits, 4);
    batteryWarning = BitUtils.isBitOne(errorBits, 5);
    batteryProtect = BitUtils.isBitOne(errorBits, 6);
    batteryError = BitUtils.isBitOne(errorBits, 7);
  }

  // 转换为Map
  @override
  Map<String, dynamic> toMap() {
    return {
      'voltage': voltage,
      'charge_current': chargeCurrent,
      'discharge_current': dischargeCurrent,
      'state_detected': stateDetected ? 1 : 0,
      'state_enable': stateEnable ? 1 : 0,
      'state_charge': stateCharge ? 1 : 0,
      'error_logic': errorLogic ? 1 : 0,
      'error_signal': errorSignal ? 1 : 0,
      'error_voltage_sensor': errorVoltageSensor ? 1 : 0,
      'error_current_sensor': errorCurrentSensor ? 1 : 0,
      'error_cannot_charge': errorCannotCharge ? 1 : 0,
      'battery_warning': batteryWarning ? 1 : 0,
      'battery_protect': batteryProtect ? 1 : 0,
      'battery_error': batteryError ? 1 : 0,
    };
  }
}
